前言
以前對於例外處理直覺就是在方法內包 try ~ catch ~ ,後來對於每一個方法都這樣做開始有點疲乏
到後來,開始會使用 Filter、中介等等去捕捉,但還是有一些誤解!
今天來分享所學習到對於例外處理的筆記與觀念 ~
分享主軸
只是有些情況下你可能需要在方法中捕捉特定的已知異常,這些異常是可以預期並且可以處理的
,才會需要自己獨立寫 Try ~ Catch預期的例外異常
app.UseExceptionHandler("/Home/Error");
UseExceptionHandler() : 為設置全域異常處理的中介,它可以捕捉應用程式中未處理的異常,並將請求重定向到指定的錯誤處理路徑
這樣可以統一處理異常,並返回友好的錯誤頁面或錯誤信息給用戶
public class HomeController : Controller
{
public IActionResult Error()
{
var exceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
ViewBag.ExceptionPath = exceptionDetails?.Path;
ViewBag.ExceptionMessage = exceptionDetails?.Error.Message;
ViewBag.StackTrace = exceptionDetails?.Error.StackTrace;
return View();
}
}
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<div>
<h3>Exception Details:</h3>
<p>Path: @ViewBag.ExceptionPath</p>
<p>Message: @ViewBag.ExceptionMessage</p>
<p>Stack Trace: @ViewBag.StackTrace</p>
</div>
public class CustomerAccountController() : Controller
{
public IActionResult Login()
{
throw new Exception("Test exception");
}
}
也可以自訂義中介捕捉例外加上寫 Log 紀錄對照,回傳友善訊息給頁面,如下範例
今日結語
在方法內完全不用刻意寫 try catch ,利用 Middleware 幫我們做這些整個應用程式的捕捉異常事情,如 app.UseExceptionHandler(”....”),不要花時間做這件事情
如果需求是不允許中斷需求時,我們才需要在方法內寫 try catch,這種情況通常意謂發生的例外是可以被預判的,所以通常會去捕捉可以預期的例外而不是非預期的例外
參考文章
https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0